package com.xinzhitong.www.service;

import com.xinzhitong.www.enumeration.PostOrderType;
import com.xinzhitong.www.exception.*;
import com.xinzhitong.www.exception.post.PostNotExistException;
import com.xinzhitong.www.utils.MyPageInfo;

import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 岗位服务
 *
 * @author 徐鑫 魏骆淳
 */
public interface PostService {

    /**
     * 获取岗位信息
     *
     * @param id 岗位id
     * @return 岗位信息
     * @throws PostNotExistException 岗位不存在异常
     */
    Map<String, Object> getPostInfo(Integer id) throws PostNotExistException;

    /**
     * 报名指定岗位
     *
     * @param id 岗位id
     * @throws PostNotExistException 岗位不存在异常
     * @throws EnrollException       报名异常
     */
    void enrollThePost(Integer id) throws PostNotExistException, EnrollException;

    /**
     * 根据条件筛选岗位
     *
     * @param conditions    条件
     * @param keyWord       关键词
     * @param postOrderType 排序方式
     * @param pageNo        页码
     * @param pageSize      页大小
     * @return 岗位
     */
    MyPageInfo getPostsSatisfyTheConditionOf(
            Map<String, Object> conditions,
            String keyWord,
            PostOrderType postOrderType,
            Integer pageNo,
            Integer pageSize
    ) throws PostException;

    /**
     * 获取学历枚举值
     *
     * @return 学历枚举值列表
     */
    Set<String> getEduEnum();

    /**
     * 获取岗位概览并支持关键字和状态查找
     *
     * @param state    状态
     * @param name     名字关键字
     * @param pageNo   页大小
     * @param pageSize 页码
     * @return 岗位概览
     * @throws PostGeneralException 岗位概览异常
     */
    MyPageInfo getPostGeneral(String state, String name, Integer pageNo, Integer pageSize)
            throws PostGeneralException;

    /**
     * 获取岗位报名情况
     *
     * @param postId 岗位id
     * @return 报名情况
     * @throws PostConditionException 岗位报名情况异常
     */
    List<Map<String, Object>> getPostCondition(Integer postId) throws PostConditionException;

    /**
     * 获取岗位新增报名人数
     *
     * @return 新增人数
     */
    Integer getPostNewEnroll();

    /**
     * 下架招聘
     *
     * @param id 岗位id
     * @return 空
     */
    String underCarriage(Integer id);

    /**
     * 批量删除招聘
     *
     * @param idList 岗位id列表
     * @return 删除成功提示
     */
    String deletePost(List<Integer> idList);

    /**
     * 工种id获取职位
     *
     * @param id 工种id
     * @return 职位信息
     * @throws PositionGetException 职位获取异常
     */
    List<Map<String, Object>> getPosition(Integer id) throws PositionGetException;

    /**
     * 获取岗位基本信息
     *
     * @param postId 岗位id
     * @return 岗位基本信息
     * @throws PostException 岗位异常
     */
    Map<String, Object> getPostInformation(Integer postId) throws PostException;

    /**
     * 获取岗位重要指标
     *
     * @param postId 岗位id
     * @return 岗位重要指标
     * @throws PostException 岗位异常
     */
    Map<String, Object> getPostIndex(Integer postId) throws PostException;

    /**
     * 发布新增招聘
     *
     * @param positionId           职位id
     * @param requirePopulation    要求人数
     * @param contact              联系方式
     * @param address              地址
     * @param baseSalary           基础工资
     * @param maxSalary            最大工资
     * @param minSalary            最小工资
     * @param paySalaryDate        发薪日期
     * @param payType              结算方式
     * @param salaryOtherNotice    工资其他说明
     * @param liveNotice           住宿说明
     * @param foodNotice           饮食说明
     * @param socialSecurityNotice 社保说明
     * @param liveFoodOtherNotice  其他说明
     * @param jobText              工作内容
     * @param jobTimeNotice        工作时间说明
     * @param jobWay               工作方式
     * @param jobOtherNotice       工作其他说明
     * @param sexRequest           性别要求
     * @param maxAgeRequest        最大年龄要求
     * @param minAgeRequest        最小年龄要求
     * @param eduBackground        学历要求
     * @param minExpRequest        最小经验要求
     * @param maxExpRequest        最大经验要求
     * @param credentialRequest    证书要求
     * @param employOtherNotice    雇佣其他说明
     */
    void releasePost(
            Integer positionId,
            Integer requirePopulation,
            String contact,
            String address,
            double baseSalary,
            double maxSalary,
            double minSalary,
            Integer paySalaryDate,
            String payType,
            String salaryOtherNotice,
            String liveNotice,
            String foodNotice,
            String socialSecurityNotice,
            String liveFoodOtherNotice,
            String jobText,
            String jobTimeNotice,
            String jobWay,
            String jobOtherNotice,
            Boolean sexRequest,
            Integer maxAgeRequest,
            Integer minAgeRequest,
            String eduBackground,
            Integer minExpRequest,
            Integer maxExpRequest,
            String credentialRequest,
            String employOtherNotice
    );

    /**
     * 获取岗位完整信息
     *
     * @param postId 岗位id
     * @return 岗位完整信息
     * @throws PostException 岗位异常
     */
    Map<String, Object> getPostTotalInformation(Integer postId) throws PostException;

    /**
     * 编辑岗位
     *
     * @param postId               岗位id
     * @param positionId           职位id
     * @param requirePopulation    要求人数
     * @param contact              联系方式
     * @param address              地址
     * @param baseSalary           基础工资
     * @param maxSalary            最大工资
     * @param minSalary            最小工资
     * @param paySalaryDate        发薪日期
     * @param payType              结算方式
     * @param salaryOtherNotice    工资其他说明
     * @param liveNotice           住宿说明
     * @param foodNotice           饮食说明
     * @param socialSecurityNotice 社保说明
     * @param liveFoodOtherNotice  其他说明
     * @param jobText              工作内容
     * @param jobTimeNotice        工作时间说明
     * @param jobWay               工作方式
     * @param jobOtherNotice       工作其他说明
     * @param sexRequest           性别要求
     * @param maxAgeRequest        最大年龄要求
     * @param minAgeRequest        最小年龄要求
     * @param eduBackground        学历要求
     * @param minExpRequest        最小经验要求
     * @param maxExpRequest        最大经验要求
     * @param credentialRequest    证书要求
     * @param employOtherNotice    雇佣其他说明
     */
    void editPost(
            Integer postId,
            Integer positionId,
            Integer requirePopulation,
            String contact,
            String address,
            double baseSalary,
            double maxSalary,
            double minSalary,
            Integer paySalaryDate,
            String payType,
            String salaryOtherNotice,
            String liveNotice,
            String foodNotice,
            String socialSecurityNotice,
            String liveFoodOtherNotice,
            String jobText,
            String jobTimeNotice,
            String jobWay,
            String jobOtherNotice,
            Boolean sexRequest,
            Integer maxAgeRequest,
            Integer minAgeRequest,
            String eduBackground,
            Integer minExpRequest,
            Integer maxExpRequest,
            String credentialRequest,
            String employOtherNotice
    );

    /**
     * 保存新增招聘
     *
     * @param map 招聘
     */
    void savePost(Map<String, Object> map);

    /**
     * 获取保存的招聘信息
     *
     * @return 招聘信息
     * @throws PostException 岗位异常
     */
    Map<String, Object> getSavedPost() throws PostException;

    /**
     * 获取最近编辑招聘
     *
     * @return 最近编辑招聘
     * @throws PostException 岗位异常
     */
    Map<String, Object> getRecentEditorPost() throws PostException;

    /**
     * <<<<<<< HEAD
     * 审核招聘
     *
     * @param postId 岗位id
     * @throws PostException 岗位异常
     */
    void aduitPost(Integer postId) throws PostException;

    /**
     * 驳回招聘
     *
     * @param postId 岗位id
     * @throws PostException 岗位异常
     */
    void rejectPost(Integer postId) throws PostException;

    /**
     * 获取招聘概览
     *
     * @param professionId 工种id
     * @param name         招聘名
     * @param pageNo       页码
     * @param pageSize     页大小
     * @return 招聘概览
     * @throws PostGeneralException 招聘概览异常
     */
    MyPageInfo getAdminPostGeneral(Integer professionId, String name, Integer pageNo, Integer pageSize)
            throws PostGeneralException;

    /**
     * 获取招聘指标
     *
     * @param postId 招聘id
     * @return 招聘报名人数
     */
    Integer getAdminPostEnrollCount(Integer postId);

}
